//
// Created by Administrator on 2020/7/2.
//联合体:存储空间的共用(节省存储空间、避免冗余)
//定义:
/*
union 联合体名称
{
    公用成员
protected:
    保护型成员
private:
    私有成员
};
*/
//特点:成员共有同一组内存单元;任何两个成员不会同时有效。
//例子(使用联合体保存成绩信息,并且输出):
#include <string>
#include <iostream>
using namespace std;
class ExamInfo
{
private:
    string name;//课程名称
    enum{GRADE,PASS,PERCENTAGE} mode;//计分方式
    union {
        char grade;//等级制成绩
        bool pass;//只记是否通过课程的成绩
        int percent;//百分制的成绩
    };
public:
    //三种构造函数,分别用等级、是否通过和百分初始化
    ExamInfo(string name,char grade):name(name),mode(GRADE),grade(grade){}
    ExamInfo(string name,bool pass):name(name),mode(PASS),pass(pass){}
    ExamInfo(string name,int percent):name(name),mode(PERCENTAGE),percent(percent){}
    void show();
};

void ExamInfo::show()
{
    cout<<name<<": ";
    switch (mode)
    {
        case GRADE:cout<<grade;break;
        case PASS:cout<<(pass?"PASS":"Fail");break;
        case PERCENTAGE:cout<<percent;break;
    }
    cout<<endl;
}

int main()
{
    ExamInfo course1("English",'B');
    ExamInfo course2("Calculus",true);
    ExamInfo course3("C++ Programming",85);
    course1.show();
    course2.show();
    course3.show();
    return 0;
}
